package com.administrator.scoreManageSys.service.impl;

import com.administrator.scoreManageSys.entity.system.Permission;
import com.administrator.scoreManageSys.entity.system.Role;
import com.administrator.scoreManageSys.mapper.system.RoleMapper;
import com.administrator.scoreManageSys.service.RoleService;
import com.administrator.scoreManageSys.utils.RedisUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

import static com.administrator.scoreManageSys.system.SystemConstant.*;

/**
 * 系统角色业务处理实现类
 * @author Administrator
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class RoleServiceImpl implements RoleService {


    /**
     * redis模板
     */
    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private RoleMapper roleMapper;
    @Resource
    private RedisUtils redisUtils;

    /**
     * 格式化角色权限及菜单到redis
     */
    @Override
    public void formatRolePermissionAndMenu() {
        //获取所有角色权限（三级权限）
        List<Role> roles = roleMapper.getAllRole();
        System.out.println("获取缓存 写入redis");
        for (Role role : roles) {
            //角色的权限及菜单数据
            JSONObject roleJson = new JSONObject();
            //角色的 权限数据
            JSONArray rolePermission = new JSONArray();
            //角色的 菜单
            JSONArray roleMenus = new JSONArray();
            //获取角色的一级权限
            List<Permission> permissions = role.getPermissions();
            for (Permission parent : permissions) {
                //一级权限关键字
                String parentKey = parent.getPermission();
                //当前角色 菜单封装
                JSONObject pPcMenu = new JSONObject();
                //当前一级权限菜单子集
                JSONArray pPcMenuChild = new JSONArray();
                //当前角色一级模块封装(shiro 角色)
                JSONObject pRole = new JSONObject();
                //当前一级权限菜单子集
                JSONArray pRoleChild = new JSONArray();
                //获取二级权限
                for (Permission child : (parent.getChildrenPermission())) {
                    //二级权限关键字
                    String childKey = child.getPermission();
                    //当前二级权限 菜单封装
                    JSONObject cPcMenu = new JSONObject();
                    //当前二级权限 菜单子集
                    JSONArray cPcMenuChild = new JSONArray();
                    //获取三级权限
                    for (Permission childChild : (child.getChildrenPermission())) {
                        //三级级权限关键字
                        String childChildKey = childChild.getPermission();
                        //当前角色权限封装
                        StringBuffer stringBuffer = new StringBuffer();
                        //当前二三级权限封装（shiro 权限）
                        stringBuffer.append(childKey).append(":").append(childChildKey);
                        pRoleChild.add(stringBuffer);
                        //当前权限 菜单封装
                        JSONObject ccPcMenu = new JSONObject();
                        // 三级权限 图标
                        ccPcMenu.put("icon", childChild.getIcon());
                        // 三级权限 菜单
                        ccPcMenu.put("menu_name", childChild.getMenuName());
                        // 三级权限 路由
                        ccPcMenu.put("route", childChild.getRoute());
                        //判断三级菜单 是否启用或显示
                        if (childChild.getMenuOpend() != null) {
                            ccPcMenu.put("is_show", childChild.getMenuOpend());
                        }
                        cPcMenuChild.add(ccPcMenu);
                    }
                    // 二级权限 图标
                    cPcMenu.put("icon", child.getIcon());
                    //二级权限菜单
                    cPcMenu.put("menu_name", child.getMenuName());
                    //二级权限路由
                    cPcMenu.put("route", child.getRoute());
                    //二级权限菜单子集
                    cPcMenu.put("child", cPcMenuChild);
                    //判断二级菜单是否启用
                    if (child.getMenuOpend() != null && child.getMenuOpend() == 1) {
                        cPcMenu.put("is_show", child.getMenuOpend());
                        pPcMenuChild.add(cPcMenu);
                    }
                }
                // 一级权限 图标
                pPcMenu.put("icon", parent.getIcon());
                pPcMenu.put("menu_name", parent.getMenuName());
                pPcMenu.put("child", pPcMenuChild);
                //判断一级菜单是否启用
                if (parent.getMenuOpend() != null) {
                    if (parent.getMenuOpend() == 1) {
                        pPcMenu.put("is_show",parent.getMenuOpend());
                        roleMenus.add(pPcMenu);
                    }
                }
                //角色对应shiro 角色
                pRole.put("role",parentKey);
                pRole.put("permission",pRoleChild);
                rolePermission.add(pRole);
            }
            //添加角色的权限
            roleJson.put(ROLE_PERMISSION, rolePermission);
            //添加角色PC端菜单
            roleJson.put(SYSTEM_USER_MENU, roleMenus);
            redisUtils.installCompetenceRedis(SYSTEM_USER_ROLE,role.getId(), roleJson);
            System.out.println(role.getId() + "|" + roleJson);
        }
    }
}
